<

dart:ffi を使用したネイティブ iOS コードへのバインド

Flutter モバイル アプリとデスクトップ アプリでは、ダーツ:ffiネイティブ C API を呼び出すためのライブラリ。FFIを意味する外部関数インターフェイス。同様の機能を表すその他の用語には次のものがあります。ネイティブインターフェース言語のバインディング。

ライブラリまたはプログラムが FFI ライブラリを使用できるようになる前に ネイティブ コードにバインドするには、次のことを確認する必要があります。 ネイティブ コードがロードされ、そのシンボルが Dart に表示されます。 このページはコンパイル、パッケージ化、 Flutter プラグインまたはアプリ内で iOS ネイティブ コードをロードします。

このチュートリアルでは、C/C++ をバンドルする方法を説明します。 Flutter プラグイン内のソースを使用してバインドします。 iOS 上の Dart FFI ライブラリ。 このチュートリアルでは、C 関数を作成します 32ビット加算を実装し、 「native_add」という名前の Dart プラグインを通じてそれを公開します。

動的リンクと静的リンク

ネイティブ ライブラリはアプリにリンクできます。 動的または静的に。静的にリンクされたライブラリ アプリの実行可能イメージに埋め込まれており、 アプリの起動時に読み込まれます。

静的にリンクされたライブラリのシンボルは、 を使用してロードされましたDynamicLibrary.executableまたDynamicLibrary.process

対照的に、動的にリンクされたライブラリは分散されます。 アプリ内の別のファイルまたはフォルダーに、 そしてオンデマンドでロードされます。 iOS では、動的にリンクされた ライブラリはとして配布されます.frameworkフォルダ。

動的にリンクされたライブラリは、 ダーツの使い方DynamicLibrary.open

API ドキュメントは Dart 開発チャネルから入手できます。Dart API リファレンス ドキュメント。

FFI プラグインを作成する

「native_add」という FFI プラグインを作成するには、 以下をせよ:

$ flutter create --platforms=android,ios,macos,windows,linux --template=plugin_ffi native_add
$ cd native_add

これにより、C/C++ ソースを含むプラグインが作成されます。native_add/src。 これらのソースは、さまざまなネイティブ ビルド ファイルによってビルドされます。 OSのビルドフォルダー。

FFI ライブラリは C シンボルに対してのみバインドできます。 したがって、C++ では、これらのシンボルはマークされますextern "C"

また、次のことを示す属性も追加する必要があります。 シンボルは Dart から参照されます。 リンカーがシンボルを破棄しないようにするため リンク時の最適化中。__attribute__((visibility("default"))) __attribute__((used))

iOS では、native_add/ios/native_add.podspecコードをリンクします。

ネイティブコードはdartから呼び出されますlib/native_add_bindings_generated.dart

バインディングは次のように生成されます。パッケージ:figen。

その他の使用例

iOSとmacOS

動的にリンクされたライブラリは、次のように自動的にロードされます。 アプリ起動時の動的リンカー。彼らの構成員 シンボルは次を使用して解決できますDynamicLibrary.process。 次のコマンドを使用してライブラリへのハンドルを取得することもできますDynamicLibrary.open~の範囲を制限する シンボル解決が行われますが、Apple がどのように解決するかは不明です。 レビュープロセスがこれを処理します。

アプリケーションバイナリに静的にリンクされたシンボル を使用して解決できますDynamicLibrary.executableまたDynamicLibrary.process

プラットフォームライブラリ

プラットフォーム ライブラリにリンクするには、 次の手順を使用してください。

  1. Xcode で開きますRunner.xcworkspace
  2. ターゲット プラットフォームを選択します。
  3. クリック+の中にリンクされたフレームワークとライブラリセクション。
  4. リンクするシステム ライブラリを選択します。

ファーストパーティライブラリ

ファーストパーティのネイティブ ライブラリは、次のいずれかを含めることができます。 ソースとして、または(署名付き)として.frameworkファイル。 おそらく静的にリンクされたものを含めることが可能です アーカイブも可能ですが、テストが必要です。

ソースコード

ソースコードに直接リンクするには、 次の手順を使用してください。

  1. Xcode で開きますRunner.xcworkspace
  2. C/C++/Objective-C/Swift を追加します。 ソース ファイルを Xcode プロジェクトに追加します。
  3. 次のプレフィックスを追加します エクスポートされたシンボル宣言 Dart からは見えます:

    C/C++/目的 C

    extern "C" /* <= C++ only */ __attribute__((visibility("default"))) __attribute__((used))
    

    迅速

    @_cdecl("myFunctionName")
    

コンパイルされた (動的) ライブラリ

コンパイルされた動的ライブラリにリンクするには、 次の手順を使用してください。

  1. 正しく署名されていれば、Frameworkファイルは存在しますが、 開けるRunner.xcworkspace
  2. フレームワーク ファイルを埋め込みバイナリセクション。
  3. また、リンクされたフレームワークとライブラリXcode のターゲットのセクション。

オープンソースのサードパーティ ライブラリ

両方を含む Flutter プラグインを作成するには C/C++/目的 Cダーツコード、 次の手順を使用してください。

  1. プラグインプロジェクトでは、 開けるios/<myproject>.podspec
  2. ネイティブコードをsource_files分野。

ネイティブ コードは静的にリンクされます。 を使用するアプリのアプリケーション バイナリ このプラグイン。

クローズドソースのサードパーティライブラリ

Dart を含む Flutter プラグインを作成するには ソース コードですが、C/C++ ライブラリを配布します バイナリ形式では、次の手順を使用します。

  1. プラグインプロジェクトでは、 開けるios/<myproject>.podspec
  2. 追加vendored_frameworks分野。 を参照してください。CocoaPods の例。

iOS シンボルの除去

リリースアーカイブ(IPA)を作成する場合、 シンボルは Xcode によって削除されます。

  1. Xcode で、次の場所に移動します。ターゲット ランナー > ビルド設定 > ストリップ スタイル
  2. から変更するすべてのシンボル非大域シンボル